/**
 * 通用方法封装处理
 * Copyright (c) 2019 ruoyi
 */

// 日期格式化
export function parseTime (time: any, pattern: string) {
  if (arguments.length === 0 || !time) {
    return null
  }
  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time)
    } else if (typeof time === 'string') {
      time = time
        .replace(new RegExp(/-/gm), '/')
        .replace('T', ' ')
        .replace(new RegExp(/\.[\d]{3}/gm), '')
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  } as any
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

// 添加日期范围
export function addDateRange (
  params: any,
  dateRange: Array<string>,
  propName: any
) {
  let search = params
  search.params =
    typeof search.params === 'object' &&
    search.params !== null &&
    !Array.isArray(search.params)
      ? search.params
      : {}
  dateRange = Array.isArray(dateRange) ? dateRange : []
  if (typeof propName === 'undefined') {
    search.params['beginTime'] = dateRange[0]
    search.params['endTime'] = dateRange[1]
  } else {
    search.params['begin' + propName] = dateRange[0]
    search.params['end' + propName] = dateRange[1]
  }
  return search
}

// 回显数据字典
export function selectDictLabel (datas: any, value: any) {
  if (value === undefined) {
    return ''
  }
  var actions = []
  Object.keys(datas).some(key => {
    if (datas[key].value == '' + value) {
      actions.push(datas[key].label)
      return true
    }
  })
  if (actions.length === 0) {
    actions.push(value)
  }
  return actions.join('')
}

// 回显数据字典（字符串、数组）
export function selectDictLabels (datas: any, value: any, separator: string) {
  if (value === undefined || value.length === 0) {
    return ''
  }
  if (Array.isArray(value)) {
    value = value.join(',')
  }
  var actions: any = []
  var currentSeparator = undefined === separator ? ',' : separator
  var temp = value.split(currentSeparator)
  Object.keys(value.split(currentSeparator)).some(val => {
    var match = false
    Object.keys(datas).some(key => {
      if (datas[key].value == '' + temp[val]) {
        actions.push(datas[key].label + currentSeparator)
        match = true
      }
    })
    if (!match) {
      actions.push(temp[val] + currentSeparator)
    }
  })
  return actions.join('').substring(0, actions.join('').length - 1)
}

// 字符串格式化(%s )
export function sprintf (str: string) {
  var args = arguments,
    flag = true,
    i = 1
  str = str.replace(/%s/g, function () {
    var arg = args[i++]
    if (typeof arg === 'undefined') {
      flag = false
      return ''
    }
    return arg
  })
  return flag ? str : ''
}

// 转换字符串，undefined,null等转化为""
export function parseStrEmpty (str: string) {
  if (!str || str == 'undefined' || str == 'null') {
    return ''
  }
  return str
}

// 数据合并
export function mergeRecursive (source: any, target: any) {
  for (var p in target) {
    try {
      if (target[p].constructor == Object) {
        source[p] = mergeRecursive(source[p], target[p])
      } else {
        source[p] = target[p]
      }
    } catch (e) {
      source[p] = target[p]
    }
  }
  return source
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree (data: any, id: any, parentId: any, children: any) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  }

  var childrenListMap: any = {}
  var nodeIds: any = {}
  var tree = []

  for (let d of data) {
    let parentId = d[config.parentId]
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = []
    }
    nodeIds[d[config.id]] = d
    childrenListMap[parentId].push(d)
  }

  for (let d of data) {
    let parentId = d[config.parentId]
    if (nodeIds[parentId] == null) {
      tree.push(d)
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t)
  }

  function adaptToChildrenList (o: any) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]]
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c)
      }
    }
  }
  return tree
}

/**
 * 参数处理
 * @param {*} params  参数
 */
export function tansParams (params: any) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName]
    var part = encodeURIComponent(propName) + '='
    if (value !== null && value !== '' && typeof value !== 'undefined') {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (
            value[key] !== null &&
            value[key] !== '' &&
            typeof value[key] !== 'undefined'
          ) {
            let params = propName + '[' + key + ']'
            var subPart = encodeURIComponent(params) + '='
            result += subPart + encodeURIComponent(value[key]) + '&'
          }
        }
      } else {
        result += part + encodeURIComponent(value) + '&'
      }
    }
  }
  return result
}

// 验证是否为blob格式
export function blobValidate (data: any) {
  return data.type !== 'application/json'
}

export function isNotEmpty (str: string) {
  if (Object.prototype.toString.call(str) == '[object Object]') {
    if (Object.keys(str).length > 0) {
      return true
    } else {
      return false
    }
  } else {
    if (str != '' && str != null && str != undefined && str != 'null') {
      return true
    } else {
      return false
    }
  }
}

// 时间对象  --->   日期yyyy-MM-dd
export function parseDate (date: any) {
  var date: any = new Date(date)
  var y = date.getFullYear()
  var m = date.getMonth() + 1
  m = m < 10 ? '0' + m : m
  var d = date.getDate()
  d = d < 10 ? '0' + d : d
  let time = y + '-' + m + '-' + d
  return time
}
// data对象转日期时间字符串  yyyy-MM-dd hh:mm
export function parseTimeHM (date: any) {
  var date: any = new Date(date)
  var y = date.getFullYear()
  var m = date.getMonth() + 1
  m = m < 10 ? '0' + m : m
  var d = date.getDate()
  d = d < 10 ? '0' + d : d
  var h = date.getHours()
  h = h < 10 ? '0' + h : h
  var minute = date.getMinutes()
  var second = date.getSeconds()
  minute = minute < 10 ? '0' + minute : minute
  second = second < 10 ? '0' + second : second
  let time = y + '-' + m + '-' + d + ' ' + h + ':' + minute
  return time
}
/**
 * 将日期解析为年-月-日 时:分:秒的格式
 *
 * @param date 日期字符串或Date对象
 * @returns 返回解析后的日期字符串，格式为"年-月-日 时:分:秒"
 */
export function parseTimeHMs (date: any) {
  var date: any = new Date(date)
  var y = date.getFullYear()
  var m = date.getMonth() + 1
  m = m < 10 ? '0' + m : m
  var d = date.getDate()
  d = d < 10 ? '0' + d : d
  var h = date.getHours()
  h = h < 10 ? '0' + h : h
  var minute = date.getMinutes()
  var second = date.getSeconds()
  minute = minute < 10 ? '0' + minute : minute
  second = second < 10 ? '0' + second : second
  let time = y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
  return time
}

// 校验信息
export function verifyInfo (str: string, type: string) {
  let strReg: any = ''
  //身份证校验
  if (type == 'cert') {
    strReg =
      /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
  }

  //手机号校验
  if (type == 'phone') {
    strReg =
      /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
  }

  //姓名校验 (2-4个中文字符)
  if (type == 'name') {
    strReg = /^[\u4e00-\u9fa5]{2,10}$/
  }

  //电子邮箱
  if (type == 'email') {
    strReg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
  }
  const flag = strReg.test(str)
  return flag
}

// 数字加千分号
export function formatNumberRgx (num: number) {
  var parts = num.toString().split('.')
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',')
  return parts.join('.')
}

// 有小数保留两位小数，没有只保留整数
export function toDecimal2 (x: number | string) {
  var f = parseFloat(x + '')
  if (isNaN(f)) {
    return 0
  }
  return f.toFixed(2).toString().split('.')[1] == '00'
    ? f.toFixed(0)
    : f.toFixed(2)
}

// 去除分隔符换行显示
export function syToBr (str: string) {
  let a: any = []
  if (isNotEmpty(str)) {
    str.split(/,|，|;|；|、|\.|。|\s+/).forEach(i => {
      if (isNotEmpty(i)) {
        a.push(i)
      }
    })
    // 去除相同的
    a = Array.from(new Set(a))
    return a.join('<br/>')
  } else {
    return ''
  }
}

// 去除分隔符转为数组
export function syToArr (str: string) {
  let a: any = []
  if (isNotEmpty(str)) {
    str.split(/,|，|;|；|、|\.|。|\s+/).forEach(i => {
      if (isNotEmpty(i)) {
        a.push(i)
      }
    })
    // 去除相同的
    a = Array.from(new Set(a))
    return a
  } else {
    return []
  }
}

// 处理文件路径，如果不是http开头的就加上基础路径
export function dealFilePath (url: string) {
  if (url.indexOf('http') < 0 && url.indexOf('https') < 0) {
    return process.env.VUE_APP_FILE_BASEURL + url
  } else {
    return url
  }
}

/**
 * 将URL地址指向的资源下载为文件并保存到本地
 *
    urlToFile('http://example.com/image.png', 'image.png', 'image/png')
    .then(file => {
      console.log(file);
    });

 * @param url URL地址，指向要下载的资源
 * @param filename 文件名，用于保存下载的文件
 * @param mimeType MIME类型，指定文件的MIME类型
 * @returns 返回一个File对象，包含下载的文件
 */
export async function urlToFile (
  url: string,
  filename: string,
  mimeType: string
) {
  const response = await fetch(url)
  const data = await response.blob()
  return new File([data], filename, { type: mimeType })
}


import axios from 'axios'

export function portIsRunning () {
   return new Promise((resolve, reject) => {
    axios
      .get('/testConnect')
      .then(response => {
        if (response.status === 200) {
          resolve(true)
        } else {
          resolve(false)
        }
      })
      .catch(error => {
        resolve(false)
      })
  })
}
